import 'reflect-metadata'

export const createParamsDecorator = (key: string) => {
  // target：控制器原型 propertyKey： 方法名（handlerRequest） parameterIndex：参数索引（从右向左执行）
  return (data?: any) => (target: any, propertyKey: string, parameterIndex: number) => {
    // 给控制器类的原型的propertyKey也就是handleRqeust方法属性上添加元数据
    // 属性名实 params: handleRequest 值是一个数组，数组里应该放置数据 表示那个位置使用那个装饰器
    const existingParams = Reflect.getMetadata(`params`, target, propertyKey) || []
    // existingParams.push({ parameterIndex, key})
    // existingParams[parameterIndex] = key
    // 兼容参数控制器里面参数有不含有控制器的情况
    existingParams[parameterIndex] = { parameterIndex, key, data }
    // console.log("🚀 ~ return ~ existingParams:", existingParams)
    Reflect.defineMetadata(`params`, existingParams, target, propertyKey)
  }
}

export const Request = createParamsDecorator('Request')
export const Req = createParamsDecorator('Req')
export const Query = createParamsDecorator('Query')
export const Headers = createParamsDecorator('Headers')
export const Session = createParamsDecorator('Session')
export const Ip = createParamsDecorator('Ip')
export const Param = createParamsDecorator('Param')
